package main

import (
	"fmt"
	"strconv"
)

//hash表中具体储存值的结构体
type Node struct {
	id int
	name string
	next *Node
}

//代表hash表中每个头结点的结构体
type HeadNode struct {
	head Node
}

//代表hash表的结构体
type HashTable struct {
	table [10]HeadNode
}

//获取hash值的方法
func (n *Node) getHashValue() int {
	return n.id % 10
}

//向哈希表的单个列表中添加元素
func (hn *HeadNode) addNodeToList(n *Node) {
	temp := &hn.head
	for temp.next != nil {
		temp = temp.next
	}
	temp.next = n
}

//往hash表中添加节点
func (ht *HashTable) addNode(n *Node) {
	hashCode := n.getHashValue()
	ht.table[hashCode].addNodeToList(n)
	//ht.table[hashCode].addNodeToList(n)
}

//重写单个链表的string方法
func (hn *HeadNode) String() string {
	temp := ""
	if hn.head.next == nil {
		return temp
	}
	tempNode := hn.head.next
	for tempNode != nil {
		temp += string(tempNode.id) +", "+tempNode.name+"->"
		tempNode = tempNode.next
	}
	return temp
}

//展示hash表
func (ht *HashTable) showHashTable() {
	for i:=0;i<len(ht.table);i++ {
		fmt.Printf("HashTable[%d],%s\n", i, ht.table[i])
	}
}

func main()  {
	//node := Node{
	//	id:   0,
	//	name: "",
	//	next: nil,
	//}
	//hn := HeadNode{
	//	head: &node,
	//}
	var ht HashTable
	var flag = true
	for flag{
		fmt.Println("使用hashTable：")
		fmt.Println("输入add添加节点")
		//fmt.Println("输入get获取元素")
		fmt.Println("输入show展示hashTable")
		fmt.Println("输入exit退出")
		var commend string
		var id,name string
		_, _ = fmt.Scanln(&commend)
		switch commend {
			case "add":
				fmt.Print("输入要添加的节点id:")
				_, _ = fmt.Scanln(&id)
				data, err := strconv.Atoi(id)
				if err != nil {
					fmt.Println("请输入正整数")
					continue
				}
				fmt.Print("输入要添加的节点name:")
				_, _ = fmt.Scanln(&name)
				node := &Node{
					id:   data,
					name: name,
					next: nil,
				}
				ht.addNode(node)
			//case "get":
			//	data,err := q.getQueue()
			//	if err != nil {
			//		fmt.Println("err=",err)
			//	}else{
			//		fmt.Println("data=", data)
			//	}
			case "show":
				ht.showHashTable()
			case "exit":
				flag = false
			default:
				fmt.Println("请输入正确的选项")
		}
	}
}
